/*
 * Automato.java
 * 
 * Created on 1/Dez/2007, 22:12:39
 * 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Automato;

import Dicionario.Dicionario;
import Dicionario.Frase;
import Dicionario.ListaFrases;
import Estado.Estado;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.StringTokenizer;

/**
 *
 * @author Pedro
 */
public class Automato {

    ArrayList<Estado> estados= new ArrayList<Estado>();
  //  ArrayList<Integer> pilha = new ArrayList<Integer>();
   // ArrayList<Integer> actualKeywordsBag = new ArrayList<Integer>();
    KeywordsBag bag = new KeywordsBag();
    
    String palavra = new String();

    public Automato() {

    }
    public Automato(Dicionario d) {

    }

    public void CriaEstados(ListaFrases lf, Dicionario d) {
        Frase f;
        LinkedList<Integer> palavras;
        for (int i = 0; i < lf.getSize(); i++) {

            f = lf.getFrase(i);

            palavras =  f.getPalavrasDaFrase();

            Iterator<Integer> it = palavras.iterator();
            while (it.hasNext()) {

                Estado e = new Estado(it.next(), lf, d);
                if (!(this.Contains(e))) {
                    estados.add(e);
                }
            }
        }
    }

    
    public void Navega(String text, Dicionario dc, ListaFrases lf) {

        int id;
        bag.setEstadoDeOrigem(-1);
       // bag.getArrow().setPalavra(-1);
        StringTokenizer st = new StringTokenizer(text);
        Estado est=new Estado();
    
        while (st.hasMoreTokens()) {
            id = dc.getID(st.nextToken());
            palavra = dc.getPalavra(id);
           // System.out.println("ID: " + id +palavra + "\n");

            if (id != -1) {

                est = estados.get(getIndexOfState(id));
              // bag.RemoveFrasesNaoApontadas(id);

                if (est.PalavraSolta()||  bag.ContainsArrowTo(id) || bag.ArrowsIsEmpty()) {
                    
                    bag.addInicios(est.getInicios());
                                       
                    bag.IncrementaContadorParaTodos();
                    this.PrintFrasesEncontradas(bag.CheckFins(est.getFins(), est), lf);
                    bag.Intercept(est.getCaminhos());

                    
                } else {
                    //bag.getArrow().setPalavra(-1);
                   // bag.RemoveAll();
                   // bag.Reset();

                }
                bag.AddArrows(est.getCaminhos());
            } else {
                bag.Reset();
                bag.FraseIdBag.clear();
            }

            bag.setEstadoDeOrigem(id);
            bag.addEstadoToBag(est);

        }

      
    }

    public boolean Contains(Estado e) {

        int id = e.getId();

        for (int i = 0; i < this.estados.size(); i++) {
            if (this.estados.get(i).getId() == id) {
                return true;
            } else {
                return false;
            }
        }
   return false;
    }
      public int getIndexOfState(int id) {

        int a;
        int size =this.estados.size();

        for (int i = 0; i < size; i++) {
            if (estados.get(i).getId() == id) {
              return i;
            } 
        }
   return -1;
    }
  
  public Estado getLastState(int id)
{
     return estados.get(getIndexOfState(id));
  }
  public Estado getEstado(int id) {

        

        for (int i = 0; i < this.estados.size(); i++) {
            if (this.estados.get(i).getId() == id) {
                return this.estados.get(i);
            } else {
                return null;
            }
        }
   return null;
    }  
/*
     public boolean ContainsFrase(int fr){
   if(actualKeywordsBag.contains(fr)) return true;
    return false;
    }
    */
   
  /*  
    public void RemoveFromBag(int fr)
{
        actualKeywordsBag.remove(fr);
        
    }
    */

    public int getEstadoIndex(int id)
{     
      
        int size = estados.size();
       
        for(int i=0;i<size;i++)
           if(estados.get(i).getId()==id)
               return i;
        
        return -1;
            
    }
    
    /*
    public void CheckFins(ListaFrases lf,int id)
   {
     
    if(actualKeywordsBag.contains(id)){
      //faz print da frase e remove-a do bag.
      lf.getFrase(id).PrintFrase();
      this.RemoveFromBag(id);
    }
    }*/
    
    public void PrintFrasesEncontradas(ArrayList<Integer> lst,ListaFrases lf)
   {
          int sz=0;         
     int size = lst.size();
       for(int i=0;i<size;i++){
           while(bag.getMaxCounterFromFraseID(lst.get(i)) > lf.getFraseById(lst.get(i)).getSize())
               bag.getFraseIDFromBag(lst.get(i)).RemoveMaxCount();
           
           
          if(bag.getMaxCounterFromFraseID(lst.get(i))== lf.getFraseById(lst.get(i)).getSize())
          {
          lf.getFraseById(lst.get(i)).PrintFrase();
          bag.removeFromBag(lst.get(i));
         
          if(!bag.getFraseIDFromBag(lst.get(i)).CountArrayIsEmpty()){
              
          bag.getFraseIDFromBag(lst.get(i)).RemoveMaxCount();
          if(bag.getFraseIDFromBag(lst.get(i)).CountArrayIsEmpty())
              bag.FraseIdBag.remove(bag.getIndexOfFraseIDBag(lst.get(i)));
          }
          else
            bag.FraseIdBag.remove(bag.getIndexOfFraseIDBag(lst.get(i)));
          }
          
       }
    }        
}
